import path from "path";
import { cloud } from '@hw-agconnect/cloud-server';
import { user_push_token } from './model/user_push_token'; // BookInfo是Server Model
import request from 'request';

// default是user_push_token对象类型使用的存储区名
const collection = cloud.database({ zoneName: 'default' }).collection(user_push_token);

// const ZONE_NAME = 'HMOSWorld';
const SEND_URL = 'https://api.push.hicloud.com/v3/461323198429733007/messages:send';

export class PushMessage {
  async query() {
    console.info("运行user_push_token的query方法");
    return collection.query().get();
  }

  /**
   * 构建发送通知
   * @returns
   */
  async pushMessage(): Promise<string | undefined> {
    let result = undefined;
    const pushTokens: string[] = [];
    try {
      // 查询获取出所有的pushToken
      const userPushTokens: user_push_token[] = await collection.query().get();
      if (userPushTokens.length > 0) {
        // todo：可以构建消息发送的通知
        // get a random resource
        // const randomResource: ResourceResp = await this.getRandomResource();
        // if (!randomResource) {
        //   return result;
        // }

        //抽离数据表字段中的pushToken
        for (let index = 0; index < userPushTokens.length; index++) {
          const element: user_push_token = userPushTokens[index];
          pushTokens.push(element.getPush_token());
        }
        // 请求 Token 进行验证。
        const authorization: string = getAuthorization();
        // 发送消息推送请求。
        for (let i = 0; i < pushTokens.length; i += 10) {
          result = await sendMessage(pushTokens.slice(i, i + 10), authorization);
        }
      }
      return result;
    } catch (error) {
      console.info(`query user error: ${error}`);
    }
  }
}

/**
 * 发送推送通知消息
 * @param pushTokens
 * @param authorization
 * @returns
 */
function sendMessage(pushTokens: string[], authorization: string) {
  // 构建header头
  const headers = {
    "push-type": 0,
    "Authorization": authorization
  };
  // https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/push-send-alert-V14#section17790171616598
  // Request Body 构建请求体数据
  const RequestBody = {
    "payload": {
      "notification": {
        "category": "MARKETING",
        "title": "push服务标题",
        "body": "content",
        "profileId": "lwj",
        // 多行文本样式需要设置style字段为3
        "style": 3,
        "inboxContent": [
          "1. 通知栏消息样式",
          "2. 通知栏消息提醒方式和展示方式",
          "3. 通知栏消息语言本地化"
        ],
        "badge": {
          "addNum": 1,
          "setNum": 99
        },
        "image": "https://sanjitian-1256310189.cos.ap-chengdu.myqcloud.com/huaweikey/test22.jpg", //???显示不出来
        "clickAction": {
          "actionType": 0, // actionType：点击消息的动作，0表示点击消息后进入首页。
          "data": {
            "pagePath": "相册", // 点击通知消息，跳转到对应页面
          } // data：点击消息时携带的JSON格式的数据。
        },
        // 通知是否在应用在前台情况下展示，仅对alert消息生效(push-type为0)
        // "foregroundShow": true,
        "notifyId": 12345
      }
    },
    "target": {
      "token": pushTokens
    },
    "pushOptions": {
      "testMessage": true,
      "ttl": 86400
    }
  }

  return new Promise((resolve, reject) => {
    // 发送 POST 请求
    request.post({
      url: SEND_URL,
      form: JSON.stringify(RequestBody),
      headers: headers
    }, function (err, httpResponse, body) {
      console.info(`sendMessage request: ${httpResponse.statusMessage}`);
      const result = JSON.parse(body);
      console.info(`sendMessage request body: ${JSON.stringify(result)}`);
      if (httpResponse.statusCode == 200 && (result.code === "80000000" || result.code === "80100000")) {
        console.info(`sendMessage success: ${JSON.stringify(body)}`);
        resolve('发送 POST 请求成功' + result.msg);
      } else {
        reject('发送 POST 请求错误' + err);
      }
    })
  });

}


/**
 * 获取 Authorization
 * 基于服务账号生成鉴权令牌
 * @returns
 */
function getAuthorization(): string {
  // 依赖：npm i jsonwebtoken
  let private_key
  // 添加异常处理
  try {
    // 基于服务账号生成鉴权令牌 步骤
    // 1.创建服务账号密钥文件。（1136852531741838851033private.json文件）
    // 2.生成JWT Header数据
    // 根据服务账号密钥文件中的key_id字段拼接以下JSON体，对JSON体进行BASE64编码。
    const Header = {
      kid: "c253b07f49c14cecb9824bc4929ee079", // 服务账号密钥文件中key_id字段。
      typ: "JWT", // 数据类型，固定为：JWT。
      alg: "PS256" // 算法类型，固定为：PS256。
    }
    // 3.生成JWT Payload数据。
    // 根据服务账号密钥文件中的sub_account字段拼接以下JSON体，对JSON体进行BASE64编码。
    const Payload = {
      aud: "https://oauth-login.cloud.huawei.com/oauth2/v3/token", // 固定为：https://oauth-login.cloud.huawei.com/oauth2/v3/token。
      iss: "113690827", // 服务账号密钥文件中sub_account字段，标识数据生成者。
      exp: Math.floor(Date.now() / 1000) + 3600, // ？ JWT到期UTC时间戳，比iat晚3600秒。
      iat: Math.floor(Date.now() / 1000) //  JWT签发UTC时间戳，为自UTC时间1970年1月1日00:00:00的秒数（您的服务器时间需要校准为标准时间）。
    }
    // 4.生成JWT。
    // 将完成BASE64编码后的Header字符串与Payload字符串，通过“.”进行连接，您可在业务应用中，通过服务账号密钥文件中的private_key（华为不进行存储，请您妥善保管），使用SHA256withRSA/PSS算法对拼接的字符串签名。
    const fs = require('fs');
    private_key = fs.readFileSync(
      path.resolve(__dirname, 'private_key.pem'),
      'utf8'
    );
    // 签署JWT
    const jwt = require('jsonwebtoken');
    const token = jwt.sign(Payload, private_key, { algorithm: 'PS256', header: Header });
    console.log("Generated JWT:", token);
    const Authorization = 'Bearer ' + token
    console.log("Authorization:", Authorization);
    return Authorization

  } catch (error) {
    console.error('密钥加载失败:', error);
    throw new Error('身份验证配置错误');
  }

}